home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / c / vbcc.lha / vbcc / targets / ppc-morphos / include / stdarg.h < prev    next >
C/C++ Source or Header  |  2001-04-28  |  2KB  |  71 lines

  1. #pragma begin_header
  2. /* stdarg.h - PowerPC */
  3.  
  4. #ifndef __STDARG_H
  5. #define __STDARG_H 1
  6.  
  7. typedef struct {
  8.   int gpr;
  9.   int fpr;
  10.   char *regbase;
  11.   char *membase;
  12. } va_list;
  13.  
  14. char *__va_start(void);
  15. char *__va_regbase(void);
  16. int __va_fixedgpr(void);
  17. int __va_fixedfpr(void);
  18.  
  19. #define va_start(vl,dummy) \
  20.   ( \
  21.     vl.gpr=__va_fixedgpr(), \
  22.     vl.fpr=__va_fixedfpr(), \
  23.     vl.regbase=__va_regbase(), \
  24.     vl.membase=__va_start() \
  25.   )
  26.  
  27. #define va_end(vl) ((vl).regbase=(vl).membase=0)
  28.  
  29. #define va_copy(new,old) ((new)=(old))
  30.  
  31. #define __va_align(type) (__alignof(type)>=4?__alignof(type):4)
  32.  
  33. #define __va_do_align(vl,type) ((vl).membase=(char *)((((unsigned int)((vl).membase))+__va_align(type)-1)/__va_align(type)*__va_align(type)))
  34.  
  35. #define __va_mem(vl,type) (__va_do_align((vl),type),(vl).membase+=sizeof(type),((type*)((vl).membase))[-1])
  36.  
  37. #define va_arg(vl,type) \
  38.  ( \
  39.   (__typeof(type)&127)>10? \
  40.     __va_mem((vl),type) \
  41.   : \
  42.    ( \
  43.     (((__typeof(type)&127)>=6&&(__typeof(type)&127)<=8)) ? \
  44.      ( \
  45.       ++(vl).fpr<=8 ? \
  46.         ((type*)((vl).regbase+32))[(vl).fpr-1] \
  47.       : \
  48.         __va_mem((vl),type) \
  49.      ) \
  50.     : \
  51.      ( \
  52.       (__typeof(type)&127)==5? \
  53.        ( \
  54.         (vl).gpr<=6 ? \
  55.          ((vl).gpr=(((vl).gpr+3)&~1),((type*)((vl).regbase+0))[((vl).gpr>>1)-1]) \
  56.     : \
  57.      __va_mem((vl),type) \
  58.      ) \
  59.        : \
  60.        ( \
  61.     ++(vl).gpr<=8 ? \
  62.      ((type*)((vl).regbase+0))[(vl).gpr-1] \
  63.      : \
  64.      __va_mem((vl),type) \
  65.      ) \
  66.        ) \
  67.      ) \
  68.    )
  69. #endif
  70. #pragma end_header
  71.